package Funcionalidades.VerCompetencia;

import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.util.List;
import java.util.Vector;

import javax.swing.Box;
import javax.swing.BoxLayout;


import Funcionalidades.Menues.FrameUsuarioAutenticado;
import Funcionalidades.Menues.MyTableModel;
import Funcionalidades.Menues.PanelGeneral;
import Gestores.GestorCompetencia;
import Gestores.GestorFixture;
import Gestores.GestorUsuario;
import ActionListeners.*;
import Entidades.EntidadesLogica.*;

import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;

public class VerCompetencia extends PanelGeneral {

	private static final long serialVersionUID = 1L;
	private JTextField txtModnombre;
	private JTextField txtCompnombre;
	private JTextField txtCompdeporte;
	private JTextField txtCompestado;
	private JTable tablaEventos;
	private JTable tablaParticipantes;
	
	
	//ATRIBUTOS DE CLASEEE
	private String nombreComp;
	private String tipoModComp;
	private String estadoComp;
	private String deporteComp;
	private Competencia competencia;
	
	private GestorFixture gFixture;
	private GestorCompetencia gcomCompetencia;
	public VerCompetencia(FrameUsuarioAutenticado framePerteneciente, Competencia comp) {
		
		super(framePerteneciente);
		GestorUsuario.getGestorUsuario();
		gcomCompetencia=gcomCompetencia.getGestorCompetencia();
		gFixture=gFixture.getGestorFixture();
		competencia=comp;
		gcomCompetencia.setCompetencia(comp);
		actualizarCampos(comp);
		
		setPreferredSize(new Dimension(800, 500));
		setAlignmentY(1.0f);
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		setNombreCU("Ver Competencia");
		
		label=new Dimension(80, 30);
		datos=new Dimension(200, 30);
		
		Component verticalStrut = Box.createVerticalStrut(30);
		add(verticalStrut);
		
		JPanel panel = new JPanel();
		panel.getLayout();
		panel.setOpaque(false);
		add(panel);
		
		JPanel panel_1 = new JPanel();
		panel_1.setOpaque(false);
		panel.add(panel_1);
		panel_1.setPreferredSize(new Dimension(350, 80));
		panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));
		
		
		JPanel panelNombre = new JPanel();
		FlowLayout flowLayout_1 = (FlowLayout) panelNombre.getLayout();
		flowLayout_1.setAlignment(FlowLayout.LEFT);
		panel_1.add(panelNombre);
		panelNombre.setOpaque(false);
		panelNombre.setMaximumSize(panelLabel);
		
		JLabel lblNombreDeLa = new JLabel("Nombre:");
		lblNombreDeLa.setHorizontalAlignment(SwingConstants.RIGHT);
		panelNombre.add(lblNombreDeLa);
		lblNombreDeLa.setPreferredSize(label);
		
		Component horizontalStrut = Box.createHorizontalStrut(20);
		panelNombre.add(horizontalStrut);
		
		txtCompnombre = new JTextField(nombreComp);
		txtCompnombre.setHorizontalAlignment(SwingConstants.CENTER);
		panelNombre.add(txtCompnombre);
		txtCompnombre.setEnabled(false);
		txtCompnombre.setPreferredSize(datos);
		txtCompnombre.addKeyListener(new MascaraMayusculakeyListener());
		
		JPanel panelDeporte = new JPanel();
		FlowLayout flowLayout_2 = (FlowLayout) panelDeporte.getLayout();
		flowLayout_2.setAlignment(FlowLayout.LEFT);
		panel_1.add(panelDeporte);
		panelDeporte.setOpaque(false);
		panelDeporte.setMaximumSize(panelLabel);
		
		JLabel lblDeporteAsociado = new JLabel("Deporte:");
		lblDeporteAsociado.setHorizontalAlignment(SwingConstants.RIGHT);
		panelDeporte.add(lblDeporteAsociado);
		lblDeporteAsociado.setPreferredSize(label);
		
		Component horizontalStrut_2 = Box.createHorizontalStrut(20);
		panelDeporte.add(horizontalStrut_2);
		
		txtCompdeporte = new JTextField(deporteComp);
		txtCompdeporte.setHorizontalAlignment(SwingConstants.CENTER);
		panelDeporte.add(txtCompdeporte);
		txtCompdeporte.addKeyListener(new MascaraMayusculakeyListener());
		txtCompdeporte.setEnabled(false);
		txtCompdeporte.setPreferredSize(datos);
		
		JPanel panel_2 = new JPanel();
		panel_2.setPreferredSize(new Dimension(350, 80));
		panel_2.setOpaque(false);
		panel.add(panel_2);
		panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.Y_AXIS));
		
		JPanel panelModalidad = new JPanel();
		FlowLayout flowLayout_3 = (FlowLayout) panelModalidad.getLayout();
		flowLayout_3.setAlignment(FlowLayout.LEFT);
		panel_2.add(panelModalidad);
		panelModalidad.setOpaque(false);
		panelModalidad.setMaximumSize(panelLabel);
		
		JLabel lblModalidadDeLa = new JLabel("Modalidad:");
		lblModalidadDeLa.setHorizontalAlignment(SwingConstants.RIGHT);
		panelModalidad.add(lblModalidadDeLa);
		lblModalidadDeLa.setPreferredSize(label);
		
		Component horizontalStrut_1 = Box.createHorizontalStrut(20);
		panelModalidad.add(horizontalStrut_1);
		
		txtModnombre = new JTextField(tipoModComp);
		txtModnombre.setHorizontalAlignment(SwingConstants.CENTER);
		panelModalidad.add(txtModnombre);
		txtModnombre.setEnabled(false);
		txtModnombre.addKeyListener(new MascaraMayusculakeyListener());
		txtModnombre.setPreferredSize(datos);
		
		JPanel panelEstado = new JPanel();
		FlowLayout flowLayout_4 = (FlowLayout) panelEstado.getLayout();
		flowLayout_4.setAlignment(FlowLayout.LEFT);
		panel_2.add(panelEstado);
		panelEstado.setOpaque(false);
		panelEstado.setMaximumSize(panelLabel);
		
		JLabel lblEstadoDeLa = new JLabel("Estado:");
		lblEstadoDeLa.setHorizontalAlignment(SwingConstants.RIGHT);
		panelEstado.add(lblEstadoDeLa);
		lblEstadoDeLa.setPreferredSize(label);
		
		Component horizontalStrut_3 = Box.createHorizontalStrut(20);
		panelEstado.add(horizontalStrut_3);
		
		txtCompestado = new JTextField(estadoComp);
		txtCompestado.setHorizontalAlignment(SwingConstants.CENTER);
		panelEstado.add(txtCompestado);
		txtCompestado.addKeyListener(new MascaraMayusculakeyListener());
		txtCompestado.setEnabled(false);
		txtCompestado.setPreferredSize(datos);

		
		JPanel panelEventosyParticipantes = new JPanel();
		panelEventosyParticipantes.setOpaque(false);
		add(panelEventosyParticipantes);
		
		JScrollPane scrollPaneEventos = new JScrollPane();
		scrollPaneEventos.setBorder(new TitledBorder(null, "Proximos Eventos", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelEventosyParticipantes.add(scrollPaneEventos);
		scrollPaneEventos.setPreferredSize(new Dimension(350, 180));
		
		tablaEventos = new JTable();
		scrollPaneEventos.add(tablaEventos);
		tablaEventos.setModel(new ProximosEventosTableModel(proximosEventos(this.competencia)));
		tablaEventos.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		scrollPaneEventos.setViewportView(tablaEventos);
		tablaEventos.setRowSelectionAllowed(true);
		tablaEventos.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

		
		JScrollPane scrollPaneParticipantes = new JScrollPane();
		scrollPaneParticipantes.setBorder(new TitledBorder(null, "Participantes", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelEventosyParticipantes.add(scrollPaneParticipantes);
		scrollPaneParticipantes.setPreferredSize(new Dimension(350, 180));
		
		tablaParticipantes = new JTable();
		tablaParticipantes.setModel(new ParticipantesTableModel(this.competencia));
		tablaParticipantes.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		scrollPaneParticipantes.setViewportView(tablaParticipantes);
		tablaParticipantes.setRowSelectionAllowed(true);
		tablaParticipantes.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

		
		Component verticalStrut_2 = Box.createVerticalStrut(20);
		add(verticalStrut_2);
		
		JPanel panelBoton1 = new JPanel();
		panelBoton1.setOpaque(false);
		add(panelBoton1);
		panelBoton1.setMaximumSize(panelLabel);
		
		JButton btnModificarCompetencia = new JButton("Modificar Competencia");
		panelBoton1.add(btnModificarCompetencia);
		btnModificarCompetencia.setPreferredSize(datos);
		btnModificarCompetencia.addActionListener(new FuncionalidadNoImplementada());
		
		JButton btnDarDeBaja = new JButton("Dar de Baja Competencia");
		panelBoton1.add(btnDarDeBaja);
		btnDarDeBaja.setPreferredSize(datos);
		btnDarDeBaja.addActionListener(new FuncionalidadNoImplementada());
		
		JButton btnMostrarTablaCompetencia = new JButton("Mostrar Tabla Competencia");
		panelBoton1.add(btnMostrarTablaCompetencia);
		btnMostrarTablaCompetencia.setPreferredSize(datos);
		btnMostrarTablaCompetencia.addActionListener(new MostrarTablaPosicionesAction(getFramePerteneciente(),competencia));
		
		JPanel panelBoton2 = new JPanel();
		panelBoton2.setOpaque(false);
		add(panelBoton2);
		panelBoton2.setMaximumSize(panelLabel);
		
		JButton btnListarParticipantes = new JButton("Listar Participantes");
		panelBoton2.add(btnListarParticipantes);
		btnListarParticipantes.setPreferredSize(datos);
		btnListarParticipantes.addActionListener(new ListarParticipantesAction(getFramePerteneciente(),competencia));
		
		JButton btnGenerarFixture = new JButton("Generar Fixture");
		panelBoton2.add(btnGenerarFixture);
		btnGenerarFixture.setPreferredSize(datos);
		btnGenerarFixture.addActionListener(new generarFixtureAction());
		
		JButton btnMostrarFixture = new JButton("Mostrar Fixture");
		panelBoton2.add(btnMostrarFixture);
		btnMostrarFixture.setPreferredSize(datos);
		btnMostrarFixture.addActionListener(new MostrarFixtureAction(getFramePerteneciente(), competencia));
		
		JPanel panelBoton3 = new JPanel();
		panelBoton3.setOpaque(false);
		add(panelBoton3);
		panelBoton3.setMaximumSize(panelLabel);
		
		JButton btnAtras= new JButton("Volver Atras");
		panelBoton3.add(btnAtras);
		btnAtras.setPreferredSize(datos);
		
		
		Component glue = Box.createGlue();
		add(glue);
		btnAtras.addActionListener(new AtrasAction(getFramePerteneciente()));
		
	}
	
	public void actualizarCampos(Competencia c){
		
		nombreComp=c.getNombreCompetencia();
		tipoModComp=c.getModalidad().getTipoModalidad();
		estadoComp=c.getEstado();
		deporteComp=c.getDeporteAsociado();
		
	}
	
	class ProximosEventosTableModel extends MyTableModel{
		private static final long serialVersionUID = 1L;

		public ProximosEventosTableModel(Vector<Encuentro> encuentros){
			super();

			try {
				String[] columnas={"LOCAL","VISITANTE"};
				setColumnNames(columnas);
				int contador=0;
				for(int j=0; j<encuentros.size();j++)
					if(encuentros.get(j).isResultadoNull())
						contador++;
				Object[][] info= new Object[contador][2];
				setColumnNames(columnas);
				
				int indice=0;
				for(int i=0;i<encuentros.size();i++){
					if(encuentros.get(i).isResultadoNull()){
						info[indice][0]=encuentros.get(i).getParticipanteLocal().getDatosActuales().getNombre();
						info[indice][1]=encuentros.get(i).getParticipanteVisitante().getDatosActuales().getNombre();
						indice++;
					}
					
				}
				setInfo(info);
				boolean[] edits= {false,false};
				setEdits(edits);
				
				
				
			
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


			
			
		}
	}
	public Vector<Encuentro> proximosEventos(Competencia comp){
		int numero_ronda=0,indice=0;
		if(comp.getEstado().equals("PLANIFICADA") || comp.getEstado().equals("DISPUTA")){
			while(indice<comp.getRondas().size()&&numero_ronda==0){
				for(int i=0; i<comp.getRondas().get(indice).getPartidosRonda().size();i++){
					if(comp.getRondas().get(indice).getPartidosRonda().get(i).isResultadoNull()){
						numero_ronda=indice+1;
						break;
					}
				}
				indice++;

			}
			return comp.getRondas().get(numero_ronda-1).getPartidosRonda();

		}
		else
			{return new Vector<Encuentro>();}

	}
	
	class ParticipantesTableModel extends MyTableModel{
		private static final long serialVersionUID = 1L;

		public ParticipantesTableModel(Competencia c){
			super();
			Vector<Participante> participantes;
			try {
				participantes = c.getParticipantes();
				String[] columnas={"NOMBRE","CORREO ELECTRONICO"};
				setColumnNames(columnas);
				Object[][] info= new Object[participantes.size()][2];
				setColumnNames(columnas);
				

				for(int i=0;i<participantes.size();i++){
					info[i][0]=participantes.get(i).getDatosActuales().getNombre();
					info[i][1]=participantes.get(i).getDatosActuales().getCorreoElectronico();
				}
				setInfo(info);
				boolean[] edits= {false,false};
				setEdits(edits);
				
				
				
			
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


			
		}
		

		
		
	}
	
	class generarFixtureAction extends AbstractAction{


		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			gcomCompetencia.setCompetencia(competencia);
			try {
				gFixture.GenerarFixtureSistemaLiga(competencia);
				JOptionPane.showMessageDialog(getFramePerteneciente(), "Se ha generado el fixture correctamente",
					    "Felicitaciones",
					    JOptionPane.INFORMATION_MESSAGE);
			} catch (Throwable e) {
				// TODO Auto-generated catch block
//				e.printStackTrace();
				JOptionPane.showMessageDialog(getFramePerteneciente(), e.getMessage(),
					    "Error",
					    JOptionPane.ERROR_MESSAGE);
			}
			
		}
		
		
		
	}


}
